<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //函数声明:函数调用、参数、调用----使用function的关键字定义一个函数:
                                    //function 函数名(参数){函数体}
    //函数表达式:使用function的关键字定义一个函数并赋值给一个变量，用变量名调用:
                                    //let 变量名=function(参数){函数体};调用函数:变量名(参数)
    //匿名函数:没有函数名 
    let fn=function(a,b){
        return a+b;
    };
    console.log(fn(1,2));
    console.log('------------------------------------------');	
    //立即执行函数:匿名函数自调用
    (function(){
        console.log('立即执行函数');
    })();
    console.log('----------------------------------------------');
    //回调: 把函数当作另一个函数的参数传入，在另一个函数中调用它。
    //递归:把函数当作自己函数本身的参数，在函数自身调用自己。
    //递归执行时容易造成死循环，慎用!
    //把函数当作返回值>闭包 
    let fn1=function(a,b){
        return a+b;
    }
    let fn2=function(f){
        return f;
    }
    console.log(fn2(fn1));
    console.log(fn2(fn1(1,2))); 
    console.log('--------------------------------------------');
    //作用域:变量作用的一个范围
    /*js代码运行的两个阶段:
        1.解析(编译):语法检查、声明变量、函数
        2.运行:对所有变量进行赋值，按执行流程执行代码
    */
    /*var 和let的区别:--------let和const比var严谨，推荐使用
        1.var;可以重复声明变量，let不允许
        2.var允许声明提升，而let没有(暂时性死亡)，>var允许先访问后声明，而let必须先访问后声明
        3.var和let都有全局作用域、函数作用域，对let多了一个块作用域
        全局变量
    */
    const age=18;//const不可以重新赋值
    // age=11;
    console.log(age);
    console.log('----------------------------------------------');
    var x=10;
    console.log(x);
    var x='hello';
    console.log(x);
    console.log('-------------------------------------------');
    let a=10;
    console.log(a); 
    // let a='hello';
    // console.log(a);//会报错 
    console.log('-------------------------------------------');
    console.log(t1); 
    let t2;
    console.log(t2); 
    var t1=123;
    // let t2=456;//会报错
    console.log('-----------------------------------------------');
    let num1=10;
    var num2=20;
    function fun(){
        //局部交量:函数作用域申声明变量 
        let f1='helle';
        var f2=' javascript';
        console.log(num1);//能访问 
        console.log(num2);//能访问 
        console.log(f1);//能访问
        console.log(f2);//能访问 
    }
     fun();
     console.log('----------------------------------------------');	
     console.log(num1);//能访问 
     console.log(num1);//能访问
     // console.iog(f1);//不能访问:局部变量在超出函数作用域范围后不能访问
     // console.log(f2);//不能访问:局部变量在超出经数作用填范围后不能访问
     console.log('------------------------------------------------');	
    //块作用域:
    for(let i=0;i<3;i++){		
        console.log('let:'+i);
    }
    // console,log('i'+1);//不能访问:无法访问在块作用域外的变量 
    console.log('--------------------------------------------------');	
    for(var j=0;j<3;j++){
        console.log('var:'+j);
    }
    console.log('j:'+j);//在这里的j值相当于全局变量
    console.log('-----------------------------------------------');	
</script>

</html>